package cn.player.media.view;

import android.content.Context;
import android.os.Handler;
import android.os.Message;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.widget.HorizontalScrollView;

/**
 * 可监听是否正在滑动的HorizontalScrollView
 *
 * @author zengliang
 */
public class MyHorizontalScrollView extends HorizontalScrollView {
    private final static int INTERVAL_TIME = 1000;
    private OnScrollListener onScrollListener;
    /**
     * 主要是用在用户手指离开MyHorizontalScrollView，MyHorizontalScrollView还在继续滑动，我们用来保存X的距离，然后做比较
     */
    private int lastScrollX;

    public MyHorizontalScrollView(Context context) {
        this(context, null);
    }

    public MyHorizontalScrollView(Context context, AttributeSet attrs) {
        this(context, attrs, 0);
    }

    public MyHorizontalScrollView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    /**
     * 设置滚动接口
     *
     * @param onScrollListener
     */
    public void setOnScrollListener(OnScrollListener onScrollListener) {
        this.onScrollListener = onScrollListener;
    }

    /**
     * 用于用户手指离开MyHorizontalScrollView的时候获取MyHorizontalScrollView滚动的X距离，然后回调给onScroll方法中
     */
    private Handler handler = new Handler() {

        public void handleMessage(Message msg) {
            int scrollX = MyHorizontalScrollView.this.getScrollY();

            // 此时的距离和记录下的距离不相等，在隔5毫秒给handler发送消息
            if (lastScrollX != scrollX) {
                lastScrollX = scrollX;
                handler.sendMessageDelayed(handler.obtainMessage(), INTERVAL_TIME);
            }
            if (onScrollListener != null) {
                onScrollListener.onScroll(scrollX);
            }

        }

        ;

    };

    /**
     * 重写onTouchEvent， 当用户的手在MyHorizontalScrollView上面的时候，
     * 直接将MyHorizontalScrollView滑动的X方向距离回调给onScroll方法中，当用户抬起手的时候，
     * MyHorizontalScrollView可能还在滑动，所以当用户抬起手隔5毫秒给handler发送消息，在handler处理
     * MyHorizontalScrollView滑动的距离
     */
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
        if (onScrollListener != null) {
            onScrollListener.onScroll(lastScrollX);
        }
        switch (ev.getAction()) {
            case MotionEvent.ACTION_UP:
                handler.sendMessageDelayed(handler.obtainMessage(), INTERVAL_TIME);
                break;
        }
        return super.onTouchEvent(ev);
    }

    /**
     * 滚动的回调接口
     *
     * @author xiaanming
     */
    public interface OnScrollListener {
        /**
         * 回调方法， 返回MyHorizontalScrollView滑动的X方向距离
         *
         * @param scrollX 、
         */
        public void onScroll(int scrollX);
    }

}
